/*
 * @Author: songliuyang
 * @Date: 2021-10-Th 06:13:02
 * @Last Modified by:   songlyyes@163.com
 * @Last Modified time: 2021-10-Th 06:13:02
 */
// js数据类型判断
export function isString (o) { // 是否字符串
  return Object.prototype.toString.call(o).slice(8, -1) === 'String'
}

export function isNumber (o) { // 是否数字
  return Object.prototype.toString.call(o).slice(8, -1) === 'Number'
}

export function isBoolean (o) { // 是否boolean
  return Object.prototype.toString.call(o).slice(8, -1) === 'Boolean'
}

export function isFunction (o) { // 是否函数
  return Object.prototype.toString.call(o).slice(8, -1) === 'Function'
}

export function isNull (o) { // 是否为null
  return Object.prototype.toString.call(o).slice(8, -1) === 'Null'
}

export function isUndefined (o) { // 是否undefined
  return Object.prototype.toString.call(o).slice(8, -1) === 'Undefined'
}

export function isObj (o) { // 是否对象
  return Object.prototype.toString.call(o).slice(8, -1) === 'Object'
}

export function isArray (o) { // 是否数组
  return Object.prototype.toString.call(o).slice(8, -1) === 'Array'
}

export function isDate (o) { // 是否时间
  return Object.prototype.toString.call(o).slice(8, -1) === 'Date'
}

export function isRegExp (o) { // 是否正则
  return Object.prototype.toString.call(o).slice(8, -1) === 'RegExp'
}

export function isError (o) { // 是否错误对象
  return Object.prototype.toString.call(o).slice(8, -1) === 'Error'
}

export function isSymbol (o) { // 是否Symbol函数
  return Object.prototype.toString.call(o).slice(8, -1) === 'Symbol'
}

export function isPromise (o) { // 是否Promise对象
  return Object.prototype.toString.call(o).slice(8, -1) === 'Promise'
}

export function isSet (o) { // 是否Set对象
  return Object.prototype.toString.call(o).slice(8, -1) === 'Set'
}

export function isFalse (o) {
  if (!o || o === 'null' || o === 'undefined' || o === 'false' || o === 'NaN') return true
  return false
}

export function isTrue (o) {
  return !this.isFalse(o)
}

export function isIos () {
  var u = navigator.userAgent
  if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) { // 安卓手机
    // return "Android";
    return false
  } else if (u.indexOf('iPhone') > -1) { // 苹果手机
    // return "iPhone";
    return true
  } else if (u.indexOf('iPad') > -1) { // iPad
    // return "iPad";
    return false
  } else if (u.indexOf('Windows Phone') > -1) { // winphone手机
    // return "Windows Phone";
    return false
  } else {
    return false
  }
}

export const isPC = _ => { // 是否为PC端
  var userAgentInfo = navigator.userAgent
  var Agents = ['Android', 'iPhone',
    'SymbianOS', 'Windows Phone',
    'iPad', 'iPod']
  var flag = true
  for (var v = 0; v < Agents.length; v++) {
    if (userAgentInfo.indexOf(Agents[v]) > 0) {
      flag = false
      break
    }
  }
  return flag
}

export function browserType () {
  var userAgent = navigator.userAgent // 取得浏览器的userAgent字符串
  var isOpera = userAgent.indexOf('Opera') > -1 // 判断是否Opera浏览器
  var isIE = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1 && !isOpera // 判断是否IE浏览器
  var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1
  var isEdge = userAgent.indexOf('Edge') > -1 && !isIE // 判断是否IE的Edge浏览器
  var isFF = userAgent.indexOf('Firefox') > -1 // 判断是否Firefox浏览器
  var isSafari = userAgent.indexOf('Safari') > -1 && userAgent.indexOf('Chrome') == -1 // 判断是否Safari浏览器
  var isChrome = userAgent.indexOf('Chrome') > -1 && userAgent.indexOf('Safari') > -1 // 判断Chrome浏览器

  if (isIE) {
    var reIE = new RegExp('MSIE (\\d+\\.\\d+);')
    reIE.test(userAgent)
    var fIEVersion = parseFloat(RegExp.$1)
    if (fIEVersion == 7) return 'IE7'
    else if (fIEVersion == 8) return 'IE8'
    else if (fIEVersion == 9) return 'IE9'
    else if (fIEVersion == 10) return 'IE10'
    else return 'IE7以下'// IE版本过低
  }
  if (isIE11) return 'IE11'
  if (isEdge) return 'Edge'
  if (isFF) return 'FF'
  if (isOpera) return 'Opera'
  if (isSafari) return 'Safari'
  if (isChrome) return 'Chrome'
}

// checkStr 检查常见类型的字符串
export function checkStr (str, type) {
  switch (type) {
    case 'phone': // 手机号码
      return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str)
    case 'tel': // 座机
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str)
    case 'card': // 身份证
      return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str)
    case 'pwd': // 密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
      return /^[a-zA-Z]\w{5,17}$/.test(str)
    case 'postal': // 邮政编码
      return /[1-9]\d{5}(?!\d)/.test(str)
    case 'QQ': // QQ号
      return /^[1-9][0-9]{4,9}$/.test(str)
    case 'email': // 邮箱
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str)
    case 'money': // 金额(小数点2位)
      return /^\d*(?:\.\d{0,2})?$/.test(str)
    case 'URL': // 网址
      return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
    case 'IP': // IP
      return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str)
    case 'date': // 日期时间
      return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
    case 'number': // 数字
      return /^[0-9]$/.test(str)
    case 'english': // 英文
      return /^[a-zA-Z]+$/.test(str)
    case 'chinese': // 中文
      return /^[\u4E00-\u9FA5]+$/.test(str)
    case 'lower': // 小写
      return /^[a-z]+$/.test(str)
    case 'upper': // 大写
      return /^[A-Z]+$/.test(str)
    case 'HTML': // HTML标记
      return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str)
    default:
      return true
  }
}

// 严格的身份证校验
export function isCardID (sId) {
  if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) {
    alert('你输入的身份证长度或格式错误')
    return false
  }
  // 身份证城市
  var aCity = { 11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江', 31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北', 43: '湖南', 44: '广东', 45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏', 65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外' }
  if (!aCity[parseInt(sId.substr(0, 2))]) {
    alert('你的身份证地区非法')
    return false
  }

  // 出生日期验证
  var sBirthday = (sId.substr(6, 4) + '-' + Number(sId.substr(10, 2)) + '-' + Number(sId.substr(12, 2))).replace(/-/g, '/')
  var d = new Date(sBirthday)
  if (sBirthday != (d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate())) {
    alert('身份证上的出生日期非法')
    return false
  }

  // 身份证号码校验
  var sum = 0
  var weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
  var codes = '10X98765432'
  for (var i = 0; i < sId.length - 1; i++) {
    sum += sId[i] * weights[i]
  }
  var last = codes[sum % 11] // 计算出来的最后一位身份证号码
  if (sId[sId.length - 1] != last) {
    alert('你输入的身份证号非法')
    return false
  }
  return true
}
